home *** CD-ROM | disk | FTP | other *** search
RISC OS BBC BASIC V Source | 1993-07-15 | 13.6 KB | 700 lines |
- >!RunImage
- Cambridge Instruction Set Emulator
- Version 1.01 (21st May 1993) Copyright
- A. M. Pereira 1993
- q% 256, main 4096, menu 1024, iconspace 4096
- ,iconend=iconspace+4096:iconptr=iconspace
- make$(255), make(255)
- '!q%=1:q%!4=2:q%!8=3:q%!12=4:q%!16=0
- "Wimp_Initialise",300,&4B534154,"Cambridge Emulator",q%
- wimp_ver,task_handle
- a = 0
- x = 0
- pc = 0
- in = 0
- out = 0
- scrap =
- speed = 20
- running =
- quit =
- loadtemplates
- iconbar=
- iconbar
- "OS_ReadMonotonicTime"
- time
- "Wimp_PollIdle",,q%,time + speed
- event
- event
- !
- 0 :
- running
- !(
- 2 :
- "Wimp_OpenWindow",,q%
- ")
- 3 :
- "Wimp_CloseWindow",,q%
-
- 6 :
- mouse
-
- 7 :
- dragover
-
- 8 :
- keypress
-
- 9 :
- menuselect
-
- 17,18 :
- message
- quit
- "Wimp_CloseDown",task_handle,&4B534154
- "OS_Module",4,"CambridgeEm"
- iconbar
- !q% = -1
- q%!4 = 0
- q%!8 = 0
- q%!12 = 68
- q%!16 = 68
- q%!20 = %11000000011010
- $(q%+24)="!cambridge"
- "Wimp_CreateIcon",,q%
- iconbar
- =iconbar
- loadtemplates
- "Wimp_OpenTemplate",,"<Camb$Dir>.Templates"
- "Wimp_LoadTemplate",,main,iconptr,iconend,-1,"info",0
- ,,iconptr
- "Wimp_CreateWindow",,main
- infohandle
- "Wimp_LoadTemplate",,main,iconptr,iconend,-1,"save",0
- ,,iconptr
- "Wimp_CreateWindow",,main
- savehandle
- "Wimp_LoadTemplate",,main,iconptr,iconend,-1,"main",0
- "Wimp_CreateWindow",,main
- mainhandle
- "Wimp_CloseTemplate"
- !q%=savehandle
- q%!4=1
- "Wimp_GetIconState",,q%
- $(q%!28)="Object"+
- mouse
- q%!12
- L
- -2 :
- ibarclick
- M
- savehandle :
- saveclick
- N
- mainhandle :
- mainclick
- ibarclick
- (q%!8
- %010)=%010
- menu(q%!0-64,96+(5*44))
- (q%!8
- %100)=%100
- openmain
- menuheader(pointer,width,title$)
- menupointer=pointer
- $menupointer=title$+
- menupointer?12=7
- menupointer?13=2
- menupointer?14=7
- menupointer?15=0
- menupointer!16=width
- menupointer!20=44
- menupointer!24=0
- menupointer+=28
- menuitem(subm,flags,tflags,text$)
- menupointer!0=flags
- menupointer!4=subm
- menupointer!8=tflags
- $(menupointer+12)=text$+
- menupointer+=24
- menu(x,y)
- menuheader(menu+768, 192, "Speed")
- !menupointer=%10000100
- menupointer!4=-1
- menupointer!8=&07008111
- menupointer!12=menu+900
- menupointer!16=menu+920
- menupointer!20=8
- $(menu+900)=
- (speed/10)
- $(menu+920)="A0-9"
- menuheader(menu, 192, "Cambridge")
- menuitem(infohandle, 0, &7000031, "Info")
- menuitem(savehandle, 0, &7000031, "Save")
- menuitem(menu+768, 0, &7000031, "Speed")
- menuitem(-1, 0, &7000031, "Reset")
- menuitem(-1, 1<<7, &7000031, "Quit")
- "Wimp_CreateMenu",,menu,x,y
- menuselect
- !q%
- info
- save
- setspeed
- "Cambridge_Reset"
- 6
- seticonstring(mainhandle, 32, "Start")
- running=
- 4: quit=
- "Wimp_GetPointerInfo",,q%
- (q%!8
- %001)=%001
- menu(x,y)
- message
- q%!16
- 0: quit=
- datasave
- filerreply
- filedrop
- endofsave
- endofsave
- "Wimp_CreateMenu",,-1
- openmain
- !main=mainhandle
- "Wimp_GetWindowState",,main
- main!28=-1
- "Wimp_OpenWindow",,main
- dragover
- dragsprite
- "DragASprite_Stop":dragsprite=
- !q%=savehandle
- q%!4=1
- "Wimp_GetIconState",,q%
- name$=""
- pos=q%!28
- ?pos>32
- name$+=
- (?pos):pos+=1
- ?pos<33
- pos>(q%!28)+64
- "Wimp_GetPointerInfo",,q%
- theirwindow=q%!12
- theiricon=q%!16
- x=q%!0
- y=q%!4
- q%!12=0
- q%!16=1
- q%!20=theirwindow
- q%!24=theiricon
- q%!28=!q%
- q%!32=q%!4
- q%!36=256
- q%!40=&ffd
- name$,".")
- name$=
- name$,
- name$,".")+1)
- $(q%+44)=name$+
- #length=(
- ((45+
- (name$))/4)+1)*4
- !q%=length
- "Wimp_SendMessage",17,q%,theirwindow
- keypress
- q%!0=savehandle
- q%!4=1
- q%!24=13
- saveit
- "Wimp_CreateMenu",,-1
- "Wimp_ProcessKey",q%!24
- saveclick
- q%!16
- 0 :
- dragpossible
- 1,2 :
- saveit
-
- "Wimp_CreateMenu",,-1
- dragpossible
- q%!8<>(%100*16)
- !q%=savehandle
- "Wimp_GetWindowState",,q%
- ox=q%!4-q%!20
- oy=q%!16-q%!24
- q%!4=0
- "Wimp_GetIconState",,q%
- !q%=savehandle
- q%!4=5
- q%!8=ox+q%!8
- q%!12=oy+q%!12
- q%!16=ox+q%!16
- q%!20=oy+q%!20
- q%!24=0
- q%!28=0
- q%!32=&7FFFFFFF
- q%!36=&7FFFFFFF
- "OS_Byte",161,28
- 2)=2
- "DragASprite_Start",&C5,1,"file_ffd"+
- 0,q%+8
- dragsprite=
- "Wimp_DragBox",,q%
- dragsprite=
- saveit
- !q%=savehandle
- q%!4=1
- "Wimp_GetIconState",,q%
- name$=""
- pos=q%!28
- ?pos>32
- name$+=
- (?pos):pos+=1
- ?pos<33
- name$,".")
- savefile(name$)
- reporterror(5,"To save, drag the icon to a directory viewer.",%001)
- filerreply
- theirref=q%!8
- name$=""
- pos=q%+44
- ?pos>32
- name$+=
- (?pos):pos+=1
- ?pos<33
- savefile(name$)
- q%!12=theirref
- q%!16=3
- q%!20=theirwindow
- q%!24=theiricon
- q%!28=x
- q%!32=y
- q%!36=256
- q%!40=&ffd
- $(q%+44)=name$+
- #length=(
- ((45+
- (name$))/4)+1)*4
- !q%=length
- "Wimp_SendMessage",18,q%,theirwindow,theiricon
- setspeed
- sp=menu+900
- a$=""
- ?sp>47
- ?sp<58
- a$+=
- sp+=1
- ?sp<48
- sp>=menu+908
- speed=
- (a$)*10
- datasave
- q%!40<>&ffd
- q%!40<>&fff
- wimpscrap=
- "*q%!0=(
- ((48+
- ("<Wimp$Scrap>"))/4)+1)*4
- q%!12=q%!8
- q%!16=2
- q%!36=-1
- $(q%+44)="<Wimp$Scrap>"+
- "Wimp_SendMessage",17,q%,q%!4
- scrap=
- wimpscrap
- "XOS_ReadVarVal","Wimp$Scrap",q%+128,-1,0,0
- ,,,ws
- ws=0
- reporterror(5,"Wimp$Scrap is not defined",%110)
- filedrop
- q%!40<>&ffd
- q%!40<>&fff
- fd$=""
- fdchar$=""
- X<256
- fdchar$<>
- fdchar$=
- (q%?X)
- X+=1
- fd$+=fdchar$
- loadfile(fd$)
- q%!12=q%!8
- q%!16=4
- q%!20=-2
- q%!24=iconbar
- "Wimp_SendMessage",17,q%,q%!4
- scrap
- E0
- "Wimp_StartTask","Delete <Wimp$Scrap>"
- scrap=
- e(erl,err)
- q%!0=err
- L2$(q%+4)=
- $+" (internal error code "+
- (erl)+")"
- "Wimp_ReportError",q%,%011,"Cambridge Emulator"
- ,fatal
- fatal=2
- loadfile(filename$)
- "OS_File",5,filename$
- ,,type,,length
- type=(type
- &FFF00)>>8
- "Cambridge_CodeAddress"
- code
- type=&ffd
- "Cambridge_Blank"
- W&
- "OS_File",&ff,filename$,code
- Y
- assemble(filename$,code)
- savefile(filename$)
- "Cambridge_CodeAddress"
- code
- "OS_File",10,filename$,&ffd,,code,code+256
- reporterror(errnum,errmess$,errflags)
- q%!0=errnum
- $(q%+4)=errmess$
- "Wimp_ReportError",misc,errflags,"Cambridge Emulator"
- "Cambridge_CodeAddress"
- codeaddress
- olda=a:oldx=x:oldpc=pc
- "Cambridge_Step"
- status, a, x, pc
- status=1
- running=
- n newinstr$="-- Finished --"
- seticonstring(mainhandle, 32, "Start")
- "Cambridge_Reset"
- r# newinstr$=
- "00"+
- ~pc,2)+" - "
- codeaddress?pc
- t?
- &3E: newinstr$+="3E "+
- "00"+
- ~(codeaddress?(pc+1)),2)
- u? newinstr$+=" - LDA #&"+
- ~(codeaddress?(pc+1))
- v?
- &C6: newinstr$+="C6 "+
- "00"+
- ~(codeaddress?(pc+1)),2)
- w? newinstr$+=" - ADD #&"+
- ~(codeaddress?(pc+1))
- x?
- &D6: newinstr$+="D6 "+
- "00"+
- ~(codeaddress?(pc+1)),2)
- y? newinstr$+=" - SUB #&"+
- ~(codeaddress?(pc+1))
- z?
- &E6: newinstr$+="E6 "+
- "00"+
- ~(codeaddress?(pc+1)),2)
- {? newinstr$+=" - SUB #&"+
- ~(codeaddress?(pc+1))
- |?
- &EE: newinstr$+="EE "+
- "00"+
- ~(codeaddress?(pc+1)),2)
- }? newinstr$+=" - EOR #&"+
- ~(codeaddress?(pc+1))
- ~?
- &3A: newinstr$+="3A "+
- "00"+
- ~(codeaddress?(pc+1)),2)
- ? newinstr$+=" - LDA &"+
- ~(codeaddress?(pc+1))
- ?
- &32: newinstr$+="32 "+
- "00"+
- ~(codeaddress?(pc+1)),2)
- ? newinstr$+=" - STA &"+
- ~(codeaddress?(pc+1))
- ,
- &7E: newinstr$+=" 7E - LDA (X) "
- ,
- &77: newinstr$+=" 77 - STA (X) "
- ,
- &86: newinstr$+=" 86 - ADD (X) "
- ,
- &96: newinstr$+=" 96 - SUB (X) "
- ,
- &A6: newinstr$+=" A6 - AND (X) "
- ,
- &AE: newinstr$+=" AE - EOR (X) "
- ,
- &6F: newinstr$+=" 6F - TAX "
- ,
- &7D: newinstr$+=" 7D - TXA "
- ,
- &C9: newinstr$+=" C9 - INX "
- ?
- &C3: newinstr$+="C3 "+
- "00"+
- ~(codeaddress?(pc+1)),2)
- ? newinstr$+=" - JMP &"+
- ~(codeaddress?(pc+1))
- ?
- &CA: newinstr$+="CA "+
- "00"+
- ~(codeaddress?(pc+1)),2)
- ? newinstr$+=" - JEQ &"+
- ~(codeaddress?(pc+1))
- ?
- &C2: newinstr$+="C2 "+
- "00"+
- ~(codeaddress?(pc+1)),2)
- ? newinstr$+=" - JNE &"+
- ~(codeaddress?(pc+1))
- ,
- &00: newinstr$+=" 00 - NOP "
- ,
- &76: newinstr$+=" 76 - HLT "
- seticonstring(mainhandle, 4, newinstr$)
- olda<>a
- seticonnumber(mainhandle, 10, a)
- oldx<>x
- seticonnumber(mainhandle, 11, x)
- oldin=in:oldout=out
- "Cambridge_ReadIOState"
- in, out
- oldin<>in
- seticonnumber(mainhandle, 21, in)
- oldout<>out
- seticonnumber(mainhandle, 0, out)
- bit=7
- oldin<>in
- (in
- 2^bit)>0
- 0
- selecticon(mainhandle, 13+(7-bit),
-
- 0
- selecticon(mainhandle, 13+(7-bit),
-
- oldout<>out
- (out
- 2^bit)>0
- 0
- selecticon(mainhandle, 23+(7-bit),
-
- 0
- selecticon(mainhandle, 23+(7-bit),
-
- mainclick
- q%!16
- 32:
- running
- 4
- seticonstring(mainhandle, 32, "Start")
- running=
- 3
- seticonstring(mainhandle, 32, "Stop")
- running=
-
- 13,14,15,16,17,18,19,20:
- "Cambridge_ReadIOState"
- $ c=a
- (2^(7 - (q%!16 - 13)))
- %
- "Cambridge_SetIOState",c,b
- c<a
- +
- selecticon(mainhandle, q%!16,
-
- +
- selecticon(mainhandle, q%!16,
-
- seticonstring(w, i, s$)
- !q%=w
- q%!4=i
- "Wimp_GetIconState",,q%
- $(q%!28)=s$
- !q%=w
- q%!4=i
- q%!8=0:q%!12=0
- "Wimp_SetIconState",,q%
- seticonvalid(w, i, v$)
- !q%=w
- q%!4=i
- "Wimp_GetIconState",,q%
- $(q%!32)=v$
- !q%=w
- q%!4=i
- q%!8=0:q%!12=0
- "Wimp_SetIconState",,q%
- seticonnumber(w, i, n)
- seticonstring(w, i, "&"+
- "00"+
- ~n,2))
- selecticon(w, i, select)
- !q%=w
- q%!4=i
- select
- q%!8=1<<21:q%!12=1<<21
- q%!8=0:q%!12=1<<21
- "Wimp_SetIconState",,q%
- assemble(filename$, assembleto)
- make$()=""
- make()=0
- nmade=0
- (filename$)
- pass=0
- p%=assembleto
- word$=
- getword
- word$
- *
- "MAKE" : make$(nmade)=
- getword
- 0 make(nmade) =
- getword)
- nmade+=1
-
- "LDA" :
-
- "STA" :
-
- "ADD" :
-
- "SUB" :
-
- "AND" :
-
- "EOR" :
- "
- "TAX" : ?p%=&6F:p%+=1
- "
- "TXA" : ?p%=&7D:p%+=1
- "
- "INX" : ?p%=&C9:p%+=1
-
- "JMP" :
-
- "JEQ" :
-
- "JNE" :
-
- "NOP" : ?p%=0:p%+=1
- "
- "HLT" : ?p%=&76:p%+=1
-
- "DEFB" :
-
- +
- word$, 1, 1)="."
- label(word$)
- word$="END"
- label(w$)
- make$(nmade)=
- w$,2)
- make(nmade)=p%-assembleto
- nmade+=1
- value(exp$)
- pass=0
- ans=0
- ans=&FFF
- l=0
- nmade-1
- %
- exp$=make$(l)
- ans=make(l)
- ans=&FFF
- ans=
- (exp$)
- par$=
- getword
- par$,1,1)
- "#" : ?p%=&3E: p%?1=
- value(
- par$,2)): p%+=2
- "X" : ?p%=&7E: p%+=1
- : ?p%=&3A: p%?1=
- value(par$): p%+=2
- par$=
- getword
- par$,1,1)
- "X" : ?p%=&77: p%+=1
- : ?p%=&32: p%?1=
- value(par$): p%+=2
- par$=
- getword
- par$,1,1)
- "#" : ?p%=&C6: p%?1=
- value(
- par$,2)):p%+=2
- "X" : ?p%=&86: p%+=1
- par$=
- getword
- par$,1,1)
- "#" : ?p%=&D6: p%?1=
- value(
- par$,2)):p%+=2
- "X" : ?p%=&96: p%+=1
- par$=
- getword
- par$,1,1)
- "#" : ?p%=&E6: p%?1=
- value(
- par$,2)):p%+=2
- "X" : ?p%=&A6: p%+=1
- par$=
- getword
- par$,1,1)
- "#" : ?p%=&EE: p%?1=
- value(
- par$,2)):p%+=2
- "X" : ?p%=&AE: p%+=1
- par$=
- getword
- O$?p%=&C3: p%?1=
- value(par$):p%+=2
- par$=
- getword
- T$?p%=&CA: p%?1=
- value(par$):p%+=2
- par$=
- getword
- Y$?p%=&C2: p%?1=
- value(par$):p%+=2
- getword
- #f)
- w$="":got=
- `
-
- w$=
-
- w$<>" "
- (w$)>32
- got=
- f&
- w$=";"
- w$="\"
- #f)
-
- w$=
-
- got=
- k
- (w$)>95
- (w$)<123
- w$=
- (w$)-32)
- #f)
- q
- c=
- s$
- c>96
- c<123
- c=c
-
- c>32
- w$+=
- c<33
- w$="END"
- par$=
- getword
- par$<>"."
- ?p%=
- value(par$):p%+=1
- par$="."
-